#ifndef __BSP_SPI_FLASH_H__
#define __BSP_SPI_FLASH_H__

#include <stdint.h>
#include "bsp_typedef.h"

/* 这个扇区大小要根据芯片手册来定义 */
#define SPI_FLASH_BUFF_SIZE     4096

typedef enum 
{
    FLASH_STATUS_REG1 = 0,
    FLASH_STATUS_REG2,
    FLASH_STATUS_REG3
}reg_num_e;

typedef struct
{
    uint16_t manufact_dev_id;    /* 设备ID */
    uint16_t page_size;    /* 一页的容量（单位：字节） */
    uint16_t sector_size;  /* 一扇区的容量（单位：字节） */
    char     name[16];     /* 芯片名称 */
    uint32_t total_size;   /* 整个芯片的容量（单位：字节） */
}spi_flash_info_t;


/* 初始化 */
BOOL spi_flash_init(void);

/* 获取flash的一些参数 */
BOOL spi_flash_information(spi_flash_info_t *info);

/* 读ID */
uint16_t spi_flash_read_jedec_id(void);
uint8_t spi_flash_read_device_id(void);
uint16_t spi_flash_read_manufact_dev_id(void);

/* 擦除 */
void spi_flash_erase_chip(void);
void spi_flash_erase_4k(uint32_t addr);
void spi_flash_erase_sector_4k(uint32_t sec_n);

/* 读写数据 */
void spi_flash_write_page(uint32_t addr, uint8_t *buff, uint32_t buff_len);
void spi_flash_write(uint32_t addr, uint8_t *buff, uint32_t data_len);
void spi_flash_read(uint32_t addr, uint8_t *buff, uint32_t buff_len);

/* 读写状态寄存器 */
void spi_flash_write_status_reg(reg_num_e reg_n, uint8_t status);

#endif  /* end of __BSP_SPI_FLASH_H__ */
